package com.jsbs.iam.user.service;

import com.github.pagehelper.PageInfo;
import com.jsbs.iam.common.core.dto.Result;
import com.jsbs.iam.user.dto.*;
import com.jsbs.iam.user.entity.IamUserInfo;
import com.jsbs.iam.user.entity.IamUserTypeBase;
import com.jsbs.iam.user.entity.IamUserTypeExtendedField;
import com.jsbs.iam.user.param.*;
import com.jsbs.iam.user.vo.UserInfoSelectVo;
import com.jsbs.iam.user.vo.UserInfoVo;

import javax.servlet.http.HttpServletRequest;
import java.util.List;

public interface UserInfoService {

    /**
     * 功能描述：同步人资人员主数据，并进行基础字段、扩展字段处理
     * @param userInfoParam
     */
    List<UserInfoResp> syncUserInfo(UserInfoParam userInfoParam);

    /**
     * 功能描述：按照基础字段、扩展字段分别入表
     * @param userInfoParamsList
     */
    void dealForUserInfo(List<UserInfoParams> userInfoParamsList);

    /**
     * 功能描述：角色关联用户查询-——查询某个角色下绑定的用户
     * @param
     */
    PageInfo<IamUserInfo> queryRoleBindUsers(IamRoleQueryUserParam iamRoleQueryUserParam);

    /**
     * 功能描述：查询某个角色下还未绑定的用户
     * @param
     * @return
     */
    PageInfo<IamUserInfo> queryRoleNotBindUsers(IamRoleQueryUserParam iamRoleQueryUserParam);

    /**
     * 功能描述：根据用户编码（usercode工号）,开通账号
     * @param userCode
     * @return
     */
    boolean openAccount(List<String> userCode);

    /**
     * 根据用户id查询角色编码
     * @param userCode
     * @return
     */
    List<String> getRoleCode (String userCode);

    /**
     * 功能描述：根据用户编码（usercode）,批量将用户设置为未开通
     * @param userCode
     * @return
     */
    int batchDeleteByUserCode(List<String> userCode);

    /**
     * 功能描述：根据编码/名称/手机号搜索用户
     * @param userQueryParam
     * @return
     */
    PageInfo<UserQueryResp> queryUserByParam(UserQueryParam userQueryParam);

    PageInfo<UserQueryResp> queryUserNotOpen(UserQueryParam userQueryParam);

    /**
     * 功能描述：分页查询管理员角色绑定用户列表
     * @param userQueryParam
     * @return
     */
    PageInfo<UserQueryResp> queryBinadUser(UserQueryParam userQueryParam);

    /**
     * 获取用户类型扩展字段数据
     *
     * @param userTypeCode
     * @param companyCode
     * @return
     */
    List<IamUserTypeExtendedField> getUserTypeExtend(String userTypeCode, String companyCode);

    /**
     * 校验用户编码的唯一性
     * @param employeeCode
     * @return
     */
    int verifyEmployeeCode(String employeeCode);

    /**
     * 校验同一组织类型下只能有一个手机号
     *
     * @param orgTypeCode
     * @param phone
     * @param companyCode
     * @return
     */
    int verifyPhone(String orgTypeCode, String phone, String companyCode);

    /**
     * 新增用户
     * @param userInfoAddDto
     */
    void addUserInfo(UserInfoAddDto userInfoAddDto);

    /**
     * 根据条件查询用户数据
     * @param userInfoSelectDto
     * @return
     */
    PageInfo selectUserInfo(UserInfoSelectDto userInfoSelectDto);

    /**
     * 批量删除用户数据
     *
     * @param userInfoDeleteDto
     * @param httpServletRequest
     */
    void deleteUserInfo(UserInfoDeleteDto userInfoDeleteDto, HttpServletRequest httpServletRequest);

    /**
     * 查询用户详情数据
     *
     * @param userCode
     * @param companyCode
     * @return
     */
    UserInfoVo selectUserDetail(String userCode, String companyCode);

    /**
     * 修改用户详情数据
     * @param userInfoAddDto
     */
    void updateUserDetail(UserInfoAddDto userInfoAddDto);

    /**
     * 用户数据导入
     *
     * @param userInfoExcelDtos
     * @param companyCode
     * @param createPerson
     * @param adminRoleCode
     */
    Result userInfoImport(List<UserInfoExcelDto> userInfoExcelDtos, String companyCode, String createPerson, String adminRoleCode);

    /**
     * 根据条件查询用户数据
     * @param userInfoSelectDto
     * @return
     */
    List<UserInfoSelectVo> selectUserData(UserInfoSelectDto userInfoSelectDto);

    /**
     * 功能描述：根据 手机+组织类型编码+租户编码 查询是否存在该用户
     * @param iamUserInfoParam
     * @return IamUserInfo
     */
     IamUserInfo getUserInfoByAny(IamUserInfoParam iamUserInfoParam);


    /**
     * 查询所有用户类型数据
     * @return
     */
    List<IamUserTypeBase> getUserType(String companyCode);

    /**
     * 查询对应字段详细数据
     * @param fieldId
     * @param companyCode
     * @return
     */
    IamUserTypeExtendedField getExtendInfo(String fieldId, String companyCode);

    /**
     * 校验扩展字段唯一性
     * @param fieldId
     * @param fieldData
     * @param companyCode
     * @return
     */
    int verifyIsSole(String fieldId, String fieldData, String companyCode);

    /**
     * 校验是否修改数据
     * @param fieldId
     * @param userCode
     * @param companyCode
     * @return
     */
    String verifyFieldData(String fieldId, String userCode, String companyCode);

    /**
     * 功能描述：根据用户编码获取组织范围
     * @param userCode
     * @param companyCode
     * @return
     */
    List<String> queryOrgCode(String userCode, String companyCode);

    /**
     * 查询普管的组织权限
     *
     * @param adminRoleCode
     * @param companyCode
     * @return
     */
    List<String> getUserOrgPermission(String adminRoleCode, String companyCode);

    /**
     * 功能描述：查询动态用户组下的用户（分页展示）
     * @param：iamFilterRulesParam 筛选规则条件
     * @return PageInfo
     */
    PageInfo<IamUserInfo> queryDynamicUserGroupUserInfo(IamFilterRulesParam iamFilterRulesParam);

    /**
     * 查询用户类型扩展字段是否可以全部为空
     * @param userTypeCode
     * @param companyCode
     * @return
     */
    int verifyAllNull(String userTypeCode, String companyCode);

    /**
     * 校验用户的用户类型数据
     * @param userInfoAddDto
     * @return
     */
    String verifyUserType(UserInfoAddDto userInfoAddDto);

    /**
     * 功能描述：账户中心——账号列表分页条件查询（普管）
     * @param iamQueryUserByOrgParam
     * @return List
     */
    List<String> queryAccountListRange(IamQueryUserByOrgParam iamQueryUserByOrgParam);

}
